﻿using System;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.IO;
using System.Reflection;

namespace LinxDtefTelas
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("LinxDtef.cDtef")]

    public class cDtef
    {
       
        #region Variavel Global para retornar a classe FormDTEf o evento que aciona a escolha de opções via teclado.
        /*Variavel Global para armazenar a opção selecionada na classe base.*/
        private static string _stringGlobal;
        public static string Expired
        {
            get
            {
            return _stringGlobal;
            }
            set
            {
            _stringGlobal = value;
            }
        }
        #endregion
                
        #region Instancia de Objetos
        public string str = string.Empty;
        public string lastNsu = string.Empty;
        public int iResultado = 0;
        public string sDadosCanc = string.Empty;
        public string sMensagem = string.Empty;
        public string sResposta;
        public string strMessageBox = string.Empty;
        LogFile logLinxDTEF = new LogFile();
        FormDTEF oForm = new FormDTEF();
        private Dictionary<int, string> menuOptions = new Dictionary<int, string>();
        public static bool CheckForIllegalCrossThreadCalls { get; set; }
        public string mask { get; set; }
        Image imagem = Image.FromFile("C:\\temp\\DLL\\LinxDtef\\LinxDtef\\Imagens\\LinxPOS.ico");
        //Button btnBack = new Button();
        Button btnNext = new Button();
        Button btnHome = new Button();
        public MaskedTextBox txtCampo = new MaskedTextBox();
        Label lblDescricao = new Label();
        Label lblConteudo = new Label();    
        Button btnTipoFin1 = new Button();
        Button btnTipoFin2 = new Button();
        Button btnTipoFin3 = new Button();
        Button btnTipoFin4 = new Button();
        Button btnTipoFin5 = new Button();
        cCreateDynamicObjects createObj = new cCreateDynamicObjects();
        cCreateDynamicObjects createObjMensagem = new cCreateDynamicObjects();
        //public string mask;
        #endregion 
      
        #region Delegates
        [DllImport("msvcr70.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int _fpreset();

        [DllImport("kernel32")]
        public static extern IntPtr LoadLibrary(string pFilename);

        [DllImport("kernel32")]
        public static extern IntPtr GetProcAddress(IntPtr pDll, string pFunction);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void pCallBackProcessaMensagens();

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVProcessaMensagens(pCallBackProcessaMensagens processaMensagens);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackSetaOperacaoCancelada(bool bCancelada);        

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVSetaOperacaoCancelada(pCallBackSetaOperacaoCancelada setaOperacaoCancelada);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackOperacaoCancelada();

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVOperacaoCancelada(pCallBackOperacaoCancelada operacaoCancelada);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void pCallBackPreviewComprovante(StringBuilder oComprovante);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVPreviewComprovante(pCallBackPreviewComprovante previewComprovante);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackSolicitaConfirmacao(StringBuilder pMensagem);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVSolicitaConfirmacao(pCallBackSolicitaConfirmacao solicitacaoConfirma);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVMensagem(pCallBackMensagem mensagem);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void pCallBackMensagem(StringBuilder pMensagem);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVDisplayErro(pCallBackDisplayErro displayErro);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void pCallBackDisplayErro(StringBuilder pMensagem);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void pCallBackDisplayTerminal(StringBuilder pMensagem);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVDisplayTerminal(pCallBackDisplayTerminal terminal);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void ConfiguraFluxoExterno();

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackEntraCartao(StringBuilder pLabel, StringBuilder pCartao);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVEntraCartao(pCallBackEntraCartao entraCartao);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackEntraDataValidade(StringBuilder pLabel, StringBuilder pDataValidade);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVEntraDataValidade(pCallBackEntraDataValidade dataValidade);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackEntraCodigoSeguranca(StringBuilder pLabel, StringBuilder pEntraCodigoSeguranca, int iTamanhoMax);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVEntraCodigoSeguranca(pCallBackEntraCodigoSeguranca codigoSeguranca);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackEntraValor(StringBuilder pLabel, StringBuilder pValor, StringBuilder pValorMinimo, StringBuilder pValorMaximo);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int TransacaoCartaoCredito(StringBuilder ValorTransacao, StringBuilder NumeroCupom, StringBuilder NumeroControle);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVEntraValor(pCallBackEntraValor entraValor);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackSelecionaOpcao(StringBuilder pLabel, StringBuilder pOpcoes, IntPtr iOpcaoSelecionada);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVSelecionaOpcao(pCallBackSelecionaOpcao selecionaOpcao);
        
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackEntraNumero(StringBuilder pLabel, StringBuilder pNumero, StringBuilder pNumeroMinimo, StringBuilder pNumeroMaximo, int iMininoDigitos, int iMaximoDigitos, int iDigitosExatos);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackEntraString(StringBuilder pLabel, StringBuilder pString, StringBuilder pTamanhoMaximo);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVEntraNumero(pCallBackEntraNumero entraNumero);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVEntraString(pCallBackEntraString entraString);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int ConfirmaCartaoCredito(string NumeroControle);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int FinalizaTransacao();
        
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void ObtemLogUltimaTransacao(IntPtr pLogUltimaTransacao);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackEntraData(StringBuilder pLabel, StringBuilder pDataValidade);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVEntraData(pCallBackEntraData entraData);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int TransacaoCartaoDebito(StringBuilder ValueTransaction, StringBuilder NumberCupon, StringBuilder NumberControl);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int ConfirmaCartaoDebito(StringBuilder NumeroControle);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int pCallBackMensagemAdicional(StringBuilder pMensagemAdicional);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void pCallBackMensagemAlerta(StringBuilder pMensagemAlerta);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVMensagemAdicional(pCallBackMensagemAdicional mensagemAdicional);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void RegPDVMensagemAlerta(pCallBackMensagemAlerta mensagemAlerta);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate int TransacaoCancelamentoPagamento(string pNumeroControle);

        #endregion

        #region Events
        private event pCallBackSolicitaConfirmacao OnSolicitaConfirmacao;
        private event pCallBackMensagem OnMensagem;
        private event pCallBackDisplayErro OnDisplayErro;
        private event pCallBackDisplayTerminal OnDisplayTerminal;
        private event pCallBackEntraCartao OnEntraCartao;
        private event pCallBackEntraDataValidade OnEntraDataValidade;
        private event pCallBackEntraCodigoSeguranca OnEntraCodigoSeguranca;
        private event pCallBackEntraValor OnEntraValor;
        private event pCallBackSelecionaOpcao OnSelecionaOpcao;
        private event pCallBackEntraNumero OnEntraNumero;
        private event pCallBackEntraString OnEntraString;
        private event pCallBackEntraData OnEntraData;
        private event pCallBackMensagemAdicional OnMensagemAdicional;
        private event pCallBackMensagemAlerta OnMensagemAlerta;
        private event pCallBackPreviewComprovante OnPreviewComprovante;
        private event pCallBackOperacaoCancelada OnOperacaoCancelada;
        private event pCallBackSetaOperacaoCancelada OnSetaOperacaoCancelada;
        private event pCallBackProcessaMensagens OnProcessaMensagens;
         #endregion

        #region Properties
        private string NumeroControle = string.Empty;
        private IntPtr gDllHandle;
        private TransacaoCartaoCredito gCredito;
        private ConfirmaCartaoCredito gConfirmaCredito;
        private FinalizaTransacao gFinaliza;
        private ObtemLogUltimaTransacao gObtemLog;
        private TransacaoCartaoDebito gDebito;
        private ConfirmaCartaoDebito gConfirmaDebito;
        private TransacaoCancelamentoPagamento gTransacaoCancelamentoPagamento;

        //private DisplayMessageEventArgs _DisplayMessage = new DisplayMessageEventArgs();
        #endregion
                
        #region Load
        public void Load()
        {

            gDllHandle = LoadLibrary(@"C:\DPOS8\Bin\DPOSDRV.dll");
            //gDllHandle = LoadLibrary(@"L:\Telas CallBack\chamaLinxDtef\chamaLinxDtef\DPOSDRV.dll");
        
            _fpreset();

            RegPDVProcessaMensagens gRegProcessaMensagens = (RegPDVProcessaMensagens)GetDelegateFromDLL("RegPDVProcessaMensagens", typeof(RegPDVProcessaMensagens));

            OnProcessaMensagens += new pCallBackProcessaMensagens(Direcao_OnProcessaMensagens);
            gRegProcessaMensagens.Invoke(OnProcessaMensagens);

            RegPDVMensagemAlerta gRegMensagemAlerta = (RegPDVMensagemAlerta)GetDelegateFromDLL("RegPDVMensagemAlerta", typeof(RegPDVMensagemAlerta));

            OnMensagemAlerta += new pCallBackMensagemAlerta(Direcao_OnMensagemAlerta);
            gRegMensagemAlerta.Invoke(OnMensagemAlerta);

            RegPDVPreviewComprovante gRegPreviewComprovante = (RegPDVPreviewComprovante)GetDelegateFromDLL("RegPDVPreviewComprovante", typeof(RegPDVPreviewComprovante));

            OnPreviewComprovante += new pCallBackPreviewComprovante(Direcao_OnPreviewComprovante);
            gRegPreviewComprovante.Invoke(OnPreviewComprovante);

            RegPDVOperacaoCancelada gRegOperacaoCancelada = (RegPDVOperacaoCancelada)GetDelegateFromDLL("RegPDVOperacaoCancelada", typeof(RegPDVOperacaoCancelada));

            OnOperacaoCancelada += new pCallBackOperacaoCancelada(Direcao_OnOperacaoCancelada);
            gRegOperacaoCancelada.Invoke(OnOperacaoCancelada);

            RegPDVSetaOperacaoCancelada gRegSetaOperacaoCancelada = (RegPDVSetaOperacaoCancelada)GetDelegateFromDLL("RegPDVSetaOperacaoCancelada", typeof(RegPDVSetaOperacaoCancelada));
            
            OnSetaOperacaoCancelada += new pCallBackSetaOperacaoCancelada(Direcao_OnSetaOperacaoCancelada);
            gRegSetaOperacaoCancelada.Invoke(OnSetaOperacaoCancelada);

            RegPDVMensagemAdicional gRegMensagemAdicional = (RegPDVMensagemAdicional)GetDelegateFromDLL("RegPDVMensagemAdicional", typeof(RegPDVMensagemAdicional));

            OnMensagemAdicional += new pCallBackMensagemAdicional(Direcao_OnMensagemAdicional);
            gRegMensagemAdicional.Invoke(OnMensagemAdicional);

            RegPDVSolicitaConfirmacao gRegSolicitaConfirmacao = (RegPDVSolicitaConfirmacao)GetDelegateFromDLL("RegPDVSolicitaConfirmacao", typeof(RegPDVSolicitaConfirmacao));

            OnSolicitaConfirmacao += new pCallBackSolicitaConfirmacao(Direcao_OnSolicitaConfirmacao);
            gRegSolicitaConfirmacao.Invoke(OnSolicitaConfirmacao);

            RegPDVDisplayTerminal gRegDisplay = (RegPDVDisplayTerminal)GetDelegateFromDLL("RegPDVDisplayTerminal", typeof(RegPDVDisplayTerminal));

            OnDisplayTerminal += new pCallBackDisplayTerminal(Direcao_OnDisplayTerminal);
            gRegDisplay.Invoke(OnDisplayTerminal);
            
            RegPDVEntraCartao gRegEntraCartao = (RegPDVEntraCartao)GetDelegateFromDLL("RegPDVEntraCartao", typeof(RegPDVEntraCartao));
            OnEntraCartao += new pCallBackEntraCartao(Direcao_OnEntraCartao);
            gRegEntraCartao.Invoke(OnEntraCartao);

            RegPDVEntraDataValidade gRegEntraDataValidade = (RegPDVEntraDataValidade)GetDelegateFromDLL("RegPDVEntraDataValidade", typeof(RegPDVEntraDataValidade));
            OnEntraDataValidade += new pCallBackEntraDataValidade(Direcao_OnEntraDataValidade);
            gRegEntraDataValidade.Invoke(OnEntraDataValidade);

            RegPDVEntraCodigoSeguranca gRegEntraCodigoSeguranca = (RegPDVEntraCodigoSeguranca)GetDelegateFromDLL("RegPDVEntraCodigoSeguranca", typeof(RegPDVEntraCodigoSeguranca));
            OnEntraCodigoSeguranca += new pCallBackEntraCodigoSeguranca(Direcao_OnEntraCodigoSeguranca);
            gRegEntraCodigoSeguranca.Invoke(OnEntraCodigoSeguranca);

            RegPDVSelecionaOpcao gRegSelecionaOpcao = (RegPDVSelecionaOpcao)GetDelegateFromDLL("RegPDVSelecionaOpcao", typeof(RegPDVSelecionaOpcao));
            OnSelecionaOpcao += new pCallBackSelecionaOpcao(Direcao_OnSelecionaOpcao);
            gRegSelecionaOpcao.Invoke(OnSelecionaOpcao);

            RegPDVEntraValor gRegEntraValor = (RegPDVEntraValor)GetDelegateFromDLL("RegPDVEntraValor", typeof(RegPDVEntraValor));

            OnEntraValor += new pCallBackEntraValor(Direcao_OnEntraValor);
            gRegEntraValor.Invoke(OnEntraValor);

            RegPDVEntraNumero gRegEntraNumero = (RegPDVEntraNumero)GetDelegateFromDLL("RegPDVEntraNumero", typeof(RegPDVEntraNumero));

            OnEntraNumero += new pCallBackEntraNumero(Direcao_OnEntraNumero);
            gRegEntraNumero.Invoke(OnEntraNumero);

            RegPDVEntraString gRegEntraString = (RegPDVEntraString)GetDelegateFromDLL("RegPDVEntraString", typeof(RegPDVEntraString));

            OnEntraString += new pCallBackEntraString(Direcao_OnEntraString);
            gRegEntraString.Invoke(OnEntraString);

            RegPDVEntraData gRegEntraData = (RegPDVEntraData)GetDelegateFromDLL("RegPDVEntraData", typeof(RegPDVEntraData));

            OnEntraData += new pCallBackEntraData(Direcao_OnEntraData);
            gRegEntraData.Invoke(OnEntraData);

            RegPDVMensagem gRegMensagem = (RegPDVMensagem)GetDelegateFromDLL("RegPDVMensagem", typeof(RegPDVMensagem));

            OnMensagem += new pCallBackMensagem(Direcao_OnMensagem);
            gRegMensagem.Invoke(OnMensagem);

            RegPDVDisplayErro gRegDisplayErro = (RegPDVDisplayErro)GetDelegateFromDLL("RegPDVDisplayErro", typeof(RegPDVDisplayErro));

            OnDisplayErro += new pCallBackDisplayErro(Direcao_OnDisplayErro);
            gRegDisplayErro.Invoke(OnDisplayErro);
 
            gFinaliza = (FinalizaTransacao)GetDelegateFromDLL("FinalizaTransacao", typeof(FinalizaTransacao));

            gTransacaoCancelamentoPagamento = (TransacaoCancelamentoPagamento)GetDelegateFromDLL("TransacaoCancelamentoPagamento", typeof(TransacaoCancelamentoPagamento));
            
            _fpreset();

            logLinxDTEF.saveLogLinxDTEF(string.Empty, string.Empty);

            oForm = createObj.CreateDynamicForm("frmmensagem", 495, 174, imagem, "picBox1");
            lblDescricao = createObjMensagem.CreateDynamicLabel("lblDescricao", "Inciando LinxDTEF........", 16, 9, 400, 20,1);
            oForm.Controls.Add(lblDescricao);
             
            
        }
        #endregion

        #region GetDelegateFromDLL
        private object GetDelegateFromDLL(string pFunction, Type pType)
        {
            _fpreset();
            IntPtr lTemp = GetProcAddress(gDllHandle, pFunction);

            object gTemp = Marshal.GetDelegateForFunctionPointer(lTemp, pType);
            _fpreset();
            return gTemp;
        }
        #endregion  

        #region ObtemLog
        public string ObtemLog(bool isLogEstendido)
        {
            _fpreset();
            IntPtr intPtr = Marshal.AllocCoTaskMem(512);

            if (isLogEstendido)
            {
                byte[] value = Encoding.ASCII.GetBytes("LOGESTENDIDO");
                Marshal.Copy(value, 0, intPtr, value.Length);
            }

            gObtemLog = (ObtemLogUltimaTransacao)GetDelegateFromDLL("ObtemLogUltimaTransacao", typeof(ObtemLogUltimaTransacao));
            gObtemLog.Invoke(intPtr);

            string destination = Marshal.PtrToStringAnsi(intPtr);
            Marshal.FreeCoTaskMem(intPtr);
            _fpreset();
            return destination;
        }
        #endregion
        
        #region Direcao_OnEntraCartao // Chama o Form para comunicação com a DLL do DTEF(Obtem o numero do cartão)
        // Chama o Form para comunicação com a DLL do DTEF(Obtem o numero do cartão)
        public int Direcao_OnEntraCartao(StringBuilder pLabel, StringBuilder pCartao)
        {
            string sResposta;
            int iRes;

            iRes = MostraForm(pLabel.ToString(), "EntraCartao", out sResposta);

            pCartao.Clear();
            pCartao.Append(sResposta);
            if (iRes == -1)
            {
                return -1;
            }
            else
            {
                _fpreset();
                return 0;
            }

        }
        #endregion

        #region Direcao_OnEntraDataValidade// Chama o Form para Comunicação com a DLL do DTEF(Obtem a Data de Validade do cartão)
        // Chama o Form para Comunicação com a DLL do DTEF(Obtem a Data de Validade do cartão)
        public int Direcao_OnEntraDataValidade(StringBuilder pLabel, StringBuilder pDataValidade)
        {
            _fpreset();

            string sResposta;
            int iRes;

            iRes = MostraForm(pLabel.ToString(), "EntraDataValidade", out sResposta);

            pDataValidade.Clear();
            pDataValidade.Append(sResposta);//
            if (iRes == -1)
            {
                return -1;
            }
            else
            {
                _fpreset();
                return 0;
            }

        }
        #endregion  

        #region Direcao_OnEntraCodigoSeguranca // Chama o Form para counicação com a DLL do DTEF(Obtem o codigo de segurança do cartão)
        public int Direcao_OnEntraCodigoSeguranca(StringBuilder pLabel, StringBuilder pEntraCodigoSeguranca, int iTamanhoMax)
        {
            _fpreset();
            string sResposta;
            int iRes;
            //Int32 iResposta;
            iRes = MostraForm(pLabel.ToString(), "EntraCodigoSeguranca", out sResposta);
//            iResposta = Convert.ToInt32(sResposta);


            if (iRes == -1)
            {
                pEntraCodigoSeguranca.Clear();
                return -1;
            }
            else 
            {
                pEntraCodigoSeguranca.Append(sResposta);
                _fpreset();
                return 0;
            }
           
        }
        #endregion

        #region Direcao_OnEntraValor//Chama o form para comunicação com a DLL do DTEF(Obtem o valor e confirmação da transação)

        // Chama o form para comunicação com a DLL do DTEF(Obtem o valor e confirmação da transação)
        public int Direcao_OnEntraValor(StringBuilder pLabel, StringBuilder pValor, StringBuilder pValorMinimo, StringBuilder pValorMaximo)
        {
            _fpreset();
            string sResposta;
            int iRes;
            iRes = MostraForm(pLabel.ToString(), "EntraValor", out sResposta);

            pValor.Clear();
            pValor.Append(sResposta);

            if (iRes == -1)
            {
                return -1;
            }
            else
            {
                _fpreset();
                return 0;
            }

        }

        #endregion

        #region Direcao_OnSelecionaOpcao
        public int Direcao_OnSelecionaOpcao(StringBuilder pLabel, StringBuilder pOpcoes, IntPtr iOpcaoSelecionada)
        {
            _fpreset();
            string sResposta;
            int iRes;
            menuOptions.Clear();

            foreach (string option in pOpcoes.ToString().Split('#'))
            {
                string[] source = option.Split(',');
                string valor = source[1].Replace(")", "");

                // Tratamento de recarga de celular, onde há separador por "," (vírgula)
                if (source.Length == 3)
                    valor = source[1] + "," + source[2].Substring(0, source[2].Length - 1);
                valor = valor.Substring(valor.IndexOf('-') + 1, valor.Length - ((valor.IndexOf('-') + 1) + 1));

                // Retira a "aspas"
                if ((int)char.Parse(valor.Substring(0, 1)) == 34)
                    valor = valor.Substring(1, valor.Length - 1);

                if (source.Length == 3)
                    // Acrescenta o R$ se 
                    valor = "R$ " + valor;

                menuOptions.Add(int.Parse(source[0].ToString().Replace("(", "")), valor);
            }

            iRes = MostraForm(pLabel.ToString(), "SelecionaOpcao", out sResposta);

            if (sResposta == string.Empty || sResposta == "" || sResposta == null)
            {
                MessageBox.Show("Selecione um Tipo de Financiamento");
                _fpreset();
                return -1;
            }
            Marshal.WriteInt32(iOpcaoSelecionada, Convert.ToInt16(sResposta));
            if (iRes == -1)
            {
                return -1;
            }
            else
            {
                _fpreset();
                return 0;

            }


        }
        #endregion  

        #region Direcao_OnEntraNumero
        public int Direcao_OnEntraNumero(StringBuilder pLabel, StringBuilder pNumero, StringBuilder pNumeroMinimo, StringBuilder pNumeroMaximo, int iMininoDigitos, int iMaximoDigitos, int iDigitosExatos)
            {
                _fpreset();
                string sResposta;
                int iRes;
                iRes = MostraForm(pLabel.ToString(), "EntraNumero", out sResposta);

                if (iRes == -1)
                {
                    return -1;
                }
                else
                {
                pNumero.Clear();
                pNumero.Append(sResposta);

                    _fpreset();
                    return 0;
                }

            }
#endregion  

        #region Direcao_OnEntraString
            public int Direcao_OnEntraString(StringBuilder pLabel, StringBuilder pString, StringBuilder pTamanhoMaximo)
            {
                _fpreset();
                string sResposta;
                int iRes;

                iRes = MostraForm(pLabel.ToString(), "EntraString", out sResposta);

                pString.Clear();

                if (iRes == -1)
                {
                    return -1;
                }
                else 
                {
                pString.Append(sResposta);
                _fpreset();
                return 0;
                }

            }
            #endregion  

        #region Direcao_OnEntraData
            public int Direcao_OnEntraData(StringBuilder pLabel, StringBuilder pDataValidade)
            {
                _fpreset();
                string sResposta;
                int iRes;

                iRes = MostraForm(pLabel.ToString(), "EntraData", out sResposta);
                pDataValidade.Clear();
                if (iRes == 0)
                    pDataValidade.Append(sResposta);
                if (iRes == -1)
                    return -1;

                _fpreset();

                return 0;
            }

            #endregion

        #region Direcao_OnSolicitaConfirmacao
            public int Direcao_OnSolicitaConfirmacao(StringBuilder pMensagem)
            {
                Expired = "";
                _fpreset();
                //int IRetorno;
                Expired = "EscapePressed";
                if (sDadosCanc.Contains("VALOR A CANC."))
                {
//                    int iResultado;
                    iResultado = MostraForm(pMensagem.ToString(), "EntraResumo", out sResposta);
                    //return iResultado;
                }

                return iResultado;

            }
            #endregion  

        #region Direcao_OnDisplayTerminal
        public  void Direcao_OnDisplayTerminal(StringBuilder pMensagem)
        {
            
            _fpreset();
            System.Threading.Thread.Sleep(500);
            oForm.Refresh();
            oForm.Show();
            CheckForIllegalCrossThreadCalls = true;
            btnHome.Visible = false;
            btnNext.Visible = false;

            if (pMensagem.Length != 0)
            {
                if (pMensagem.ToString().Contains("VALOR A CANC."))
                {
                    sDadosCanc = pMensagem.ToString();
                }
             

                oForm.Controls.Add(lblDescricao);
                lblDescricao.Text = pMensagem.ToString();
                btnHome.Visible = false;
                //oForm.Refresh();
                btnNext.Visible = false;
                //oForm.Refresh();
                txtCampo.Visible = false;
                oForm.Refresh();
                oForm.Show();
           
            }
            
        }
        #endregion

        #region Direcao_OnDisplayErro
        public void Direcao_OnDisplayErro(StringBuilder pMensagem)
        {
            _fpreset();

            System.Threading.Thread.Sleep(110);
            oForm.Refresh();
            oForm.Show();
            CheckForIllegalCrossThreadCalls = true;
            btnHome.Visible = false;
            btnNext.Visible = false;

            if (pMensagem.Length != 0)
            {
                lblDescricao.BackColor = System.Drawing.Color.Red;
                oForm.Controls.Add(lblDescricao);
                lblDescricao.Text = pMensagem.ToString();
                btnHome.Visible = false;
                //oForm.Refresh();
                btnNext.Visible = false;
                //oForm.Refresh();
                txtCampo.Visible = false;
                oForm.Refresh();
                if (pMensagem.ToString().Contains("INVALID"))
                {
                    System.Threading.Thread.Sleep(2500);
                }
                oForm.Show();

            }
        }
        #endregion

        #region Direcao_OnMensagem
        public void Direcao_OnMensagem(StringBuilder pMensagem)
        {

            _fpreset();
            sMensagem = pMensagem.ToString();
        }
        #endregion

        #region Direcao_OnMensagemAdicional
        public int Direcao_OnMensagemAdicional(StringBuilder pMensagemAdicional)
        {
            _fpreset();
            lblDescricao.Text = pMensagemAdicional.ToString();
            return 0;
        }
        #endregion  

        #region Direcao_OnMensagemAlerta
        public void Direcao_OnMensagemAlerta(StringBuilder pMensagemAlerta)
        {
            _fpreset();

            MessageBox.Show("" + pMensagemAlerta.ToString());


            _fpreset();
        }
        #endregion

        #region Direcao_OnPreviewComprovante
        public void Direcao_OnPreviewComprovante(StringBuilder oComprovante)
        {
            string sResposta;
            int iRes;
            _fpreset();
            MessageBox.Show("!");
            //iRes = MostraForm(oComprovante.ToString(), "KeyPreview", out sResposta);
            _fpreset();
        }
        #endregion

        #region Direcao_OnOperacaoCancelada
        public int Direcao_OnOperacaoCancelada()
        {
            _fpreset();

            if (Expired == "EscapePressed")
            {
                return 1;
            }else
            {
                return 0;
            }

            
        }
        #endregion

        #region Direcao_OnSetaOperacaoCancelada
        public int Direcao_OnSetaOperacaoCancelada(bool bCancelada)
        {
            _fpreset();

            if (!bCancelada)
            {
               return 1;
            }

            _fpreset();
            return 0;
        }
        #endregion

        #region Direcao_OnProcessaMensagens
        public void Direcao_OnProcessaMensagens()
        {

        }

        #endregion

        #region Método para obter imagens armazenadas em Resources
        public Image getImage (string imageName)
        {
           Image img;
           switch (imageName)
           {
               case "Back":
                   img = new Bitmap(Properties.Resources.Back);
                   return img;
               case "Back_48":
                   img = new Bitmap(Properties.Resources.Back_48);
                   return img;
               case "Next":
                   img = new Bitmap(Properties.Resources.Next);
                   return img;
               case "Next_48":
                   img = new Bitmap(Properties.Resources.Next_48);
                   return img;
               case "Home":
                   img = new Bitmap(Properties.Resources.Home);
                   return img;
               case "Home_48":
                   img = new Bitmap(Properties.Resources.Home_48);
                   return img;
               case "LoginButton":
                   img = new Bitmap(Properties.Resources.LoginButton);
                   return img;
               }

           return img = new Bitmap(Properties.Resources.False);
          
        }
        #endregion

        #region Click do Mouse tela de menu de opções
        void btnTipoFin1_Click(object sender, EventArgs e)
        {
            FormDTEF.sOpcao = "1";
            oForm.DialogResult = DialogResult.OK;
        }
        void btnTipoFin2_Click(object sender, EventArgs e)
        {
            FormDTEF.sOpcao = "2";
            oForm.DialogResult = DialogResult.OK;
        }
        void btnTipoFin3_Click(object sender, EventArgs e)
        {
            FormDTEF.sOpcao = "3";
            oForm.DialogResult = DialogResult.OK;
        }
        #endregion

        private bool IsNumeric(int Val)
        {
            return ((Val >= 48 && Val <= 57) || (Val >= 96 && Val <= 105) || (Val == 8) || (Val == 46));
        }
   
        #region Keypress
        void txtCampo_KeyPress(object sender, KeyPressEventArgs e)
        {

            int KeyCode = e.KeyChar;

            if (!IsNumeric(KeyCode))
            {
                e.Handled = true;
                return;
            }
            else
            {
                e.Handled = true;
            }
            if (((KeyCode == 8) || (KeyCode == Convert.ToChar(Keys.Delete))) & (str.Length > 0))
            {
                str = str.Substring(0, str.Length - 1);


            }
            else if (!((KeyCode == 8) || (KeyCode == Convert.ToChar(Keys.Delete))))
            {
                str = str + Convert.ToChar(KeyCode);

            }
            if (str.Length == 0)
            {
                txtCampo.Text = "";
            }
            if (str.Length == 1)
            {
                txtCampo.Text = "0.0" + str;
            }
            else if (str.Length == 2)
            {
                txtCampo.Text = "0." + str;
            }
            else if (str.Length > 2)
            {
                txtCampo.Text = str.Substring(0, str.Length - 2) + "." +
                                str.Substring(str.Length - 2);
            }



        }
        #endregion

        #region KeyDown
        void txtCampo_KeyDown(object sender, KeyEventArgs e)
        {
            txtCampo.Text = "";

            if (!IsNumeric(Convert.ToInt32(e.KeyCode)))
            {
                e.Handled = true;

                return;
            }
            else
            {
                e.Handled = true;
            }
            if (((Convert.ToInt32(e.KeyCode) == 46)) & (str.Length > 0))
            {
                str = str.Substring(0, str.Length - 1);
            }
            if (str.Length == 0)
            {
                txtCampo.Text = "";
            }
            if (str.Length == 1)
            {
                txtCampo.Text = "0.0" + str;
            }
            else if (str.Length == 2)
            {
                txtCampo.Text = "0." + str;
            }
            else if (str.Length > 2)
            {
                txtCampo.Text = str.Substring(0, str.Length - 2) + "." +
                                str.Substring(str.Length - 2);
            }





        }
	    #endregion
            

        #region ConfirmaCredito
        public int ConfirmaCredito(string NumeroControle)
        {
           
                string lastLog = this.ObtemLog(false);
                
                string nsuVenda = lastLog.Substring(106, 6);
                string nsuCancelamento = lastLog.Substring(160, 6);


                if (lastLog.Contains("CNC") && NumeroControle.Trim() == nsuVenda)
                {
                    NumeroControle = nsuCancelamento;
                }
                         
            _fpreset();
            gConfirmaCredito = (ConfirmaCartaoCredito)GetDelegateFromDLL("ConfirmaCartaoCredito", typeof(ConfirmaCartaoCredito));
            _fpreset();

            if (gConfirmaCredito.Invoke(NumeroControle) == 0)
            {
                logLinxDTEF.saveLogLinxDTEF("Transacao:ConfirmaCredito",
                                           "Confirmação de operação de TEF. " + "\r\n" +
                                           "Status da Transação: TEF Confirmado");
            }
            else
            {
                logLinxDTEF.saveLogLinxDTEF("Transacao:ConfirmaCredito",
                                           "Não foi possível efetivar a operação de TEF ." + "\r\n" +
                                           "Status da Transação: TEF não Confirmado");
            }

            return gConfirmaCredito.Invoke(NumeroControle);
        }
        #endregion

        #region ConfirmaDébito
        public int ConfirmaDebito(StringBuilder NumeroControle)
        {
            _fpreset();
            gConfirmaDebito = (ConfirmaCartaoDebito)GetDelegateFromDLL("ConfirmaCartaoDebito", typeof(ConfirmaCartaoDebito));
            _fpreset();

            int iRes = gConfirmaDebito.Invoke(NumeroControle);
            if (iRes == 0)
            {
                logLinxDTEF.saveLogLinxDTEF("FinalizarTransacao",
                                            "Confirmação de operação de TEF." + "\n\r" + 
                                            "Status da Transação: TEF Confirmado");
            }
            else
            {
                logLinxDTEF.saveLogLinxDTEF("FinalizarTransacao",
                                            "Confirmação de operação de TEF." + "\n\r" + 
                                            "Status da Transação: TEF não Confirmado");
            }

            return iRes;
        }


        #endregion

        #region FinalizarTransacao
        public int FinalizarTransacao()
        {
            _fpreset();
            try
                {
                    int retorno = gFinaliza.Invoke();

                    _fpreset();

                    if (retorno == 0) //Observação o retorno do finaliza nunca esta sendo diferente de 0.
                    {
                        logLinxDTEF.saveLogLinxDTEF("Transacao:FinalizaTransacao",
                                                    "Confirmação de operação de TEF. "+"\r\n" +
                                                    "Status da Transação: TEF Confirmado");
                    }
                    else
                    {
                        logLinxDTEF.saveLogLinxDTEF("Transacao:FinalizaTransacao",
                                                    "Não foi possível efetivar a operação de TEF. " + "\r\n" +
                                                    "Status da Transação: TEF não Confirmado");
                    }

                    return retorno;
                }
            catch (Exception e)
                {
                    throw new Exception("VendaCredito.gCredito" + e.Message, e);
                }
        }
        #endregion

        #region Remove carcteres especiais de uma String
        public static string GetNonNumericData(string input)
        {
            Regex regex = new Regex("[^a-zA-Z0-9]");

            return regex.Replace(input, "");
        }
        #endregion

        #region MostraForm - Função criada para montar forms em tempo de execução
        public int MostraForm(String sLabel, string sTexto, out String sResposta)
        {
            string sOpcaocartao = string.Empty;
            string sTypeVendaCredito = "EntraCartao|EntraDataValidade|EntraCodigoSeguranca|EntraValor|EntraData|ShowProgress|EntraNumero|EntraResumo";
            string sMenuCartao = "SelecionaOpcao|KeyPreview";
    
            sResposta = "";
            Expired = null;
            oForm.Visible = false;
            
            if (sTexto == "EntraResumo" && sDadosCanc.Contains("VALOR A CANC."))
            {
                oForm = createObj.CreateDynamicForm(sLabel, 495, 174, imagem, "picBox1");

                lblDescricao = createObj.CreateDynamicLabel("lblConteudo", sDadosCanc, 16, 9, 400, 20, 1);
                lblDescricao.Text = "transação de Cancelamento de Pagamento";
                sDadosCanc = sDadosCanc.Replace("DATA", "\r\n" + "DATA: ");
                sDadosCanc = sDadosCanc.Replace("VALOR VENDA", "\r\n" + "VALOR VENDA: ");
                sDadosCanc = sDadosCanc.Replace("VALOR A CANC", "\r\n" + "VALOR A CANC: ");
                sDadosCanc = sDadosCanc.Replace("DOC", "\r\n" + "DOC: ");
                
                TextBox tbConteudo = new TextBox();
                tbConteudo.Location = new System.Drawing.Point(16, 34);
                tbConteudo.Size = new System.Drawing.Size(400, 79);
                tbConteudo.Font = new System.Drawing.Font("BankGothic Lt BT", 10.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                tbConteudo.Multiline = true;
                tbConteudo.Enabled = false;
                tbConteudo.Text = sDadosCanc;

                btnNext = createObj.CreateDynamicButton(getImage("Next_48"), "Next", "Confirmar (Enter)", 132, 114, 167, 48);
                btnHome = createObj.CreateDynamicButton(getImage("Home_48"), "Home", "Sair (Esc)", 305, 114, 167, 48);

                btnHome.DialogResult = DialogResult.Cancel;
                btnNext.DialogResult = DialogResult.OK;

                oForm.Controls.Add(btnNext);
                oForm.Controls.Add(btnHome);
                oForm.Controls.Add(lblDescricao);
                oForm.Controls.Add(tbConteudo);
                if (oForm.ShowDialog() == DialogResult.Cancel)
                    return 1;
                else
                {
                    return 0;
                }
            }
            
            
            if (sTypeVendaCredito.IndexOf(sTexto) >= 0)
            {
                
                oForm = createObj.CreateDynamicForm(sLabel, 495, 174, imagem, "picBox1");

                    if (sTexto == "EntraDataValidade")
                    {
                        txtCampo = createObj.createDynamicTextBox("txtCampo", 16, 31, 51, 26, "00/00", string.Empty);
                    }
                    else if (sTexto == "EntraCodigoSeguranca")
                    {
                        txtCampo = createObj.createDynamicTextBox("txtCampo", 16, 31, 43, 26, null, string.Empty);
                    }
                    else if (sTexto == "EntraValor")
                    {
                        txtCampo = createObj.createDynamicTextBox("txtCampo", 16, 31, 226, 26, null,"0.00");
                        txtCampo.KeyPress += new System.Windows.Forms.KeyPressEventHandler(txtCampo_KeyPress);
                        txtCampo.KeyDown += new System.Windows.Forms.KeyEventHandler(txtCampo_KeyDown);

                    }
                    else if (sTexto == "EntraData")
                    {
                        txtCampo = createObj.createDynamicTextBox("txtCampo", 16, 31, 73, 26, "00/00/00", string.Empty);
                    }
                    else
                    {
                        txtCampo = createObj.createDynamicTextBox("txtCampo", 16, 31, 226, 27, null, string.Empty);
                        Expired = sTexto;
                    }


                    lblDescricao = createObj.CreateDynamicLabel("lblDescricao", sLabel, 16, 9, 400, 20,1);
                    lblConteudo = createObj.CreateDynamicLabel("lblConteudo", sMensagem, 16, 63, 117, 13,2);

                    btnNext = createObj.CreateDynamicButton(getImage("Next_48"), "Next", "Confirmar (Enter)", 132, 114, 167, 48);
                    btnHome = createObj.CreateDynamicButton(getImage("Home_48"), "Home", "Sair (Esc)", 305, 114, 167, 48);

                    btnHome.DialogResult = DialogResult.Cancel;
                    btnNext.DialogResult = DialogResult.OK;

                    

                    oForm.Controls.Add(btnNext);
                    oForm.Controls.Add(btnHome);
                    oForm.Controls.Add(txtCampo);
                    oForm.Controls.Add(lblDescricao);
                    oForm.Controls.Add(lblConteudo);
                 
            
                if (oForm.ShowDialog() == DialogResult.Cancel)
                  return -1;
                else
                {
                    if (sTexto == "EntraData")
                    {
                        sResposta = txtCampo.Text;
                    }
                    else
                    {
                        sResposta = GetNonNumericData(txtCampo.Text);
                    }
                    sMensagem = string.Empty;
                  return 0;
                }
            }
            if (sMenuCartao.IndexOf(sTexto) >= 0 && menuOptions.Count > 0)
            {
                 oForm =  createObj.CreateDynamicForm(sLabel, 332, 300, imagem, "picBox1");
               
                foreach (var entry in menuOptions)
                {
                    sOpcaocartao = entry.Key.ToString() + " - " + entry.Value.ToString();

                    switch (entry.Key.ToString())
                    {
                        case "1":
                            btnTipoFin1 = createObj.CreateDynamicButton(getImage("LoginButton"), "btnTipoFin1", sOpcaocartao, 30, 52, 271, 48);
                            oForm.Controls.Add(btnTipoFin1);
                            break;
                        case "2":
                            btnTipoFin2 = createObj.CreateDynamicButton(getImage("LoginButton"), "btnTipoFin2", sOpcaocartao, 30, 106, 271, 48);
                            oForm.Controls.Add(btnTipoFin2);
                            break;
                        case "3":
                            btnTipoFin3 = createObj.CreateDynamicButton(getImage("LoginButton"), "btnTipoFin3", sOpcaocartao, 30, 160, 271, 48);
                            oForm.Controls.Add(btnTipoFin3);
                            break;
                        default:
                            break;
                    }

                }
                btnTipoFin4 = createObj.CreateDynamicButton(getImage("Next_48"), "btnTipoFin4", "OK (Enter)", 30, 229, 123, 48);
                btnTipoFin5 = createObj.CreateDynamicButton(getImage("Home_48"), "btnTipoFin5", "Sair (Esc)", 178, 229, 123, 48);
                lblDescricao = createObj.CreateDynamicLabel("lblDescricao", sLabel, 0, 9, 339, 22,1);

                btnTipoFin1.Click += new EventHandler(btnTipoFin1_Click);
                btnTipoFin2.Click += new EventHandler(btnTipoFin2_Click);
                btnTipoFin3.Click += new EventHandler(btnTipoFin3_Click);
                
                
                
                btnTipoFin4.DialogResult = DialogResult.OK;
                btnTipoFin5.DialogResult = DialogResult.Cancel;
                oForm.Controls.Add(btnTipoFin4);
                oForm.Controls.Add(btnTipoFin5);
                oForm.Controls.Add(lblDescricao);
                
            
                _stringGlobal = sTexto; // passa o nome do form lá para a classe base decidir qual tecla irá usar OnKeyPress
                //btnHome.DialogResult = System.Windows.Forms.DialogResult.Cancel;
                //btnTipoFin1.DialogResult = DialogResult.OK;
                if (oForm.ShowDialog() == DialogResult.Cancel)
                    return -1;
                else
                {
                    sResposta = FormDTEF.sOpcao;
                    sMensagem = string.Empty;
                    return 0;
                }
            }
            if (sMenuCartao.Contains("KeyPreview"))
            {
                oForm = createObj.CreateDynamicForm(sLabel, 332, 300, imagem, "picBox1");
                lblDescricao = createObj.CreateDynamicLabel("lblDescricao", sLabel, 0, 9, 339, 22, 1);
                oForm.Controls.Add(lblDescricao);
            }
            sMensagem = string.Empty;
            return 0;

        }
        #endregion

        #region Efetua a venda com cartao de credito

        public int VendaCredito(string valorTransacao, string cupom, string NumeroControle)
        {
                _fpreset();
               try
                {
                    gCredito = (TransacaoCartaoCredito)GetDelegateFromDLL("TransacaoCartaoCredito", typeof(TransacaoCartaoCredito));

                    int retorno = gCredito.Invoke(new StringBuilder(valorTransacao.PadLeft(12, '0'))
                                          , new StringBuilder(cupom)//(this.CurrentFiscalReceipt)
                                          , new StringBuilder(NumeroControle));
                    //, this.NumeroControle);

                    _fpreset();
                    if (retorno == 0)
                    {
                        logLinxDTEF.saveLogLinxDTEF("Transacao:VendaCredito",
                                                    "Confirmação de venda em cartão de crédito." + "\r\n" +
                                                    "Status da Transação: TEF Confirmado" + "\r\n" + "Dados da transação: " + "\r\n" +
                                                    "Valor: " + string.Format("{0:#.00}", Convert.ToDecimal(valorTransacao) / 100) + "\r\n" +
                                                    "Numero Cupom Fiscal: " + cupom + "\r\n" +
                                                    "NSU: " + NumeroControle);
                    }
                    else
                    {
                        logLinxDTEF.saveLogLinxDTEF("Transacao:VendaCredito",
                                                   "Não foi possível efetivar a operação de TEF." +"\r\n" +
                                                   "Status da Transação: TEF não Confirmado" + "\r\n" + "Dados da transação: " + "\r\n" +
                                                   "Valor: " + string.Format("{0:#.00}", Convert.ToDecimal(valorTransacao) / 100) + "\r\n" +
                                                   "Numero Cupom Fiscal: " + cupom + "\r\n" +
                                                   "NSU: " + NumeroControle);
                    }
                    return retorno;
                 
                }
                catch(Exception e)
                    {
                        throw new Exception("VendaCredito.gCredito" + e.Message, e);
                    }

        }
        #endregion

        #region Efetua venda cartao de Débito
        public int VendaDebito(string valorTransacao, string cupom, string NumeroControle)
        {
            _fpreset();
            //string valorTransacao = (pValueTransaction * 100).ToString();
            try
            {
                gDebito = (TransacaoCartaoDebito)GetDelegateFromDLL("TransacaoCartaoDebito", typeof(TransacaoCartaoDebito));
                int iRet = gDebito.Invoke(new StringBuilder(valorTransacao.PadLeft(12, '0'))
                                    , new StringBuilder(cupom)
                                    , new StringBuilder(NumeroControle));
                _fpreset();
                if (iRet == 0)
                {
                    logLinxDTEF.saveLogLinxDTEF("Transacao:VendaCredito", 
                                                "Confirmação de venda em cartão de débito." +"\r\n" +
                                                "Status da Transação: TEF Confirmado" + "\r\n" + 
                                                "Dados da transação: " + "\r\n" +
                                                "Valor: " + string.Format("{0:#.00}", Convert.ToDecimal(valorTransacao) / 100) + "\r\n" +
                                                "Numero Cupom Fiscal: " + cupom + "\r\n" +
                                                "NSU: " + NumeroControle);
                }
                else
                {
                    logLinxDTEF.saveLogLinxDTEF("Transacao:VendaCredito", 
                                                "Confirmação de venda em cartão de débito." + "\r\n" + 
                                                "Status da Transação: TEF não Confirmado" + "\r\n" + 
                                                "Dados da transação: " + "\r\n" +
                                                "Valor: " + string.Format("{0:#.00}", Convert.ToDecimal(valorTransacao) / 100) + "\r\n" +
                                                "Numero Cupom Fiscal: " + cupom + "\r\n" +
                                                "NSU: " + NumeroControle);
                }
                return iRet;
            }

            catch (Exception e)
            {

                throw new Exception("VendaDébito.gDebito" + e.Message, e);
            }

        }
        #endregion

        #region CancelarTransacao
        public int CancelarTransacao(string NumeroControle)
        {
            this.strMessageBox = "Confirma o cancelamento da transação ?";
            int retorno = 0;
           
            _fpreset();
            
            if (NumeroControle != null && NumeroControle.ToString().Length > 0)
            {
                 try
                    {
                    gTransacaoCancelamentoPagamento = (TransacaoCancelamentoPagamento)GetDelegateFromDLL("TransacaoCancelamentoPagamento", typeof(TransacaoCancelamentoPagamento));
                    retorno = (gTransacaoCancelamentoPagamento.Invoke(NumeroControle));
                    }
                    catch (Exception e)
                    {
                        throw new Exception("CancelarTransacao.gTransacaoCancelamentoPagamento" + e.Message, e);
                    }

            }
            _fpreset();

            if (retorno == 0)
            {
                //lastNsu = this.ObtemLog(false);
                //lastNsu = lastNsu.Substring(160, 6);

                logLinxDTEF.saveLogLinxDTEF("Transacao:CancelarTransacao",
                                            "Cancelamento de pagamento." + "\r\n" +
                                            "Status da Transação: TEF Confirmado" + "\r\n" +
                                            "Dados da transação: " + "\r\n" +
                                            //"Valor: " + string.Format("{0:#.00}", Convert.ToDecimal(valorTransacao) / 100) + "\r\n" +
                                            //"Numero Cupom Fiscal: " + cupom + "\r\n" +
                                            "NSU: " + lastNsu);
            }
            else
            {
                logLinxDTEF.saveLogLinxDTEF("Transacao:CancelarTransacao",
                                            "Cancelamento de pagamento." + "\r\n" +
                                            "Status da Transação: TEF Não Confirmado" + "\r\n" +
                                            "Dados da transação: " + "\r\n" +
                                            //"Valor: " + string.Format("{0:#.00}", Convert.ToDecimal(valorTransacao) / 100) + "\r\n" +
                                            //"Numero Cupom Fiscal: " + cupom + "\r\n" +
                                            "NSU: " + lastNsu);
            }
            return retorno;
        }
        #endregion

        #region Permite que uma aplicação externa feche o Form.
        public void thisCloser()
        {
            oForm.Closer();
        }
        #endregion
    }
}
